#ifndef __MVS_IOTC_SERVICE_H__
#define __MVS_IOTC_SERVICE_H__

#include "mvdef.h"
#include "mvs_core/mvs_core_ability.h"

MVCXX_EXTERN_BEGIN

typedef enum _iotc_service_mode
{
    MVS_IOTC_SERVICE_INVALID       = 0,    ///< 无效
    MVS_IOTC_SERVICE_LAN           = 1,    ///< 局域网服务
    MVS_IOTC_SERVICE_WAN           = 2,    ///< 互联网服务
}mvs_iotc_service_mode_e;

typedef struct _iotc_svc_args
{
    mv_v8_t           av8_model_name[32];  ///< model名称
    mv_v8_t           av8_product_name[32];///< product名称
    mv_u32_t          u32_cur_version;     ///< 当前版本号(sp. 0=不启用内嵌OTA模块)
    mv_v8ptr_t        pv8_db_dir;          ///< MVS-DB存储文件夹('/'结尾)，(sdk init 必须参数)
    mv_v8ptr_t        pv8_ca_dir;          ///< MVS-CA存储文件夹('/'结尾，此文件夹需包含"certs/"和"pem/"两个子文件夹)，(sdk init 必须参数)
    mv_u8_t           au8_mac[8];          ///< 当前MAC的6字节RAW DATA 或 IMEI的15位数字字符串压缩HEX; (前两字节为0x00表示MAC)
    mv_u32_t          u32_vmax_width;      ///< 当前运行最大分辨率宽度(pixel)
    mv_u32_t          u32_vmax_height;     ///< 当前运行最大分辨率高度(pixel)
    mv_u8_t           u8_live_up_max;      ///< 实时上行连接数最大限制（0=无限制）
    mv_u8_t           u8_live_down_max;    ///< 实时下行连接数最大限制（0=无限制）
    struct {
        mv_cu8ptr_t   cpu8_elic_data;      ///< 加密授权信息
        mv_s32_t      s32_data_len;        ///< 加密授权信息长度
        mv_cu8ptr_t   cpu8_hw_skey;        ///< 硬件关联授权信息唯一密钥（授权时一起获取到）
        mv_s32_t      s32_len;             ///< 唯一密钥长度
    }license;
}mvs_iotc_svc_args_t;

/**
 * @brief MVSDK初始化
 * 
 * @param pstru_args [in] 初始化参数
 * @return 初始化结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_INVALID_ARGS
 *             MV_EC_MALLOC_FAILED
 *             MV_EC_FAILED
 */
mv_s32_t mvs_iotc_sdk_init(mvs_iotc_svc_args_t *pstru_args);
/**
 * @brief 服务初始化主入口
 * 
 * @param pstru_args [in] 初始化参数
 * @param pstru_abls [in] 能力集参数地址(请保持生命周期，SDK持续引用)
 * @return 初始化结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_INVALID_ARGS
 *             MV_EC_MALLOC_FAILED
 *             MV_EC_FAILED
 * @note  服务相关的后续操作，依赖于此init的成功执行；需要在sdk init后才能调用
 */
mv_s32_t  mvs_iotc_service_init(mvs_iotc_svc_args_t *pstru_args, mvs_dev_ability_t *pstru_abls);
/* 支持局域网或互联网服务独立启用或禁用； u8_service_flag: [mvs_iotc_service_mode_e] */
/**
 * @brief 服务启动
 * 
 * @param u8_service_flag [in] 指定服务标准bitmap [mvs_iotc_service_mode_e]
 * @return 操作结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_NOT_INIT
 *             MV_EC_ABORT
 *             MV_EC_MALLOC_FAILED
 *             MV_EC_PERMS_DENIED   (当前运行模式无权限)
 */
mv_s32_t  mvs_iotc_service_start(mv_u8_t u8_service_flag);
mv_s32_t  mvs_iotc_service_stop (mv_u8_t u8_service_flag, mv_s32_t s32_await_timeout_sec);
/**
 * @brief 服务是否已准备就绪
 * 
 * @return 准备结果
 * - MV_TRUE  : 已准备
 * - MV_FALSE : 未准备
 * 
 * @note 互联网绑定状态下，绑定状态和系统时间确认后，转为已准备
 *       局域网绑定状态下，服务启动成功即转为已准备
 */
mv_bool_t mvs_iotc_service_ready(mv_void_t);

/* 获取当前存活连接数（可独立获取 或 总数混合获取） */
mv_s32_t  mvs_iotc_servce_live_connection(mv_u8_t u8_service_flag);

/* 反初始化服务（目前不建议使用） */
mv_s32_t  mvs_iotc_service_uninit(mv_void_t);

/** 当前设备ID (0为无效) */
mv_u32_t  mvs_iotc_get_did(mv_void_t);

/** 当前绑定类型（0=未绑定；1=局域网绑定；2=互联网绑定） */
mv_s32_t  mvs_iotc_bind_mode(mv_void_t);

/** 当前OT服务连接状态（MVSPT_EVENT_IOTC_DISCONNECT=根服务器未通过 / MVSPT_EVENT_IOTC_CONNECT_TRYING=主服务器尝试连接中 / MVSPT_EVENT_IOTC_CONNECTED=服务器连接正常) */
mv_s32_t mvs_iotc_status(mv_void_t);

/** 当前互联网绑定通道状态（0=未准备；1=就绪；） */
mv_s32_t  mvs_iotc_wanbinding_tans_status(mv_void_t);

/** 获取当前绑定的时区和区域配置信息 */
mv_s32_t  mvs_iotc_region_info(mv_s16ptr_t ps16_tz, mv_v8_t av8_region[32]);

/** 获取当前绑定的主账号UID (0为无效) */
mv_u64_t  mvs_iotc_master_uid(mv_void_t);

/** 获取SDK标准时间（秒） */
mv_time_t mvs_iotc_get_server_time(mv_time_t *p_ts);
/** 获取SDK标准时间（毫秒） */
mv_time_t mvs_iotc_get_server_time_msec(mv_time_t *p_ts_msec);

/**************************************
 *          event类型接口
 *************************************/
/** 网络状态变更向内通知接口 */
mv_s32_t mvs_iotc_event_netstate_change(mv_s32_t s32_mode_flags, mv_v8ptr_t pv8_main_netif); ///< [mvspt_network_mode_e]
/**
 * @brief 通知SDK当前使用LTE模块的ICCID和IMEI字符串变更
 * 
 * @param av8_iccid [out] SIM卡ICCID  (无SIM卡则为"")
 * @param av8_imei  [out] LTE模块IMEI
 * @param av8_ati   [out] LTE模块版本信息
 * @return 通知结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 * 
 * @note 当配置ability支持LTE时，必须在mvs_iotc_service_init后，每次信息发生变化时，都要调用此接口通知SDK最新信息
 */
mv_s32_t  mvs_iotc_event_lte_info_update(mv_v8_t av8_iccid[32], mv_v8_t av8_imei[32], mv_v8_t av8_ati[32]);
/***************************************
 *              misc接口
 **************************************/
/** MV错误码转SDK服务错误码接口，用于某些QA通信需要用到服务错误码的场景调用 */
mv_s32_t mvs_iotc_mv_ec_to_svc_ec(mv_s32_t s32_mv_ec);

typedef enum {
    MVS_LOG_LV_NONE ,  /* 无打印 */
    MVS_LOG_LV_ALARM,  /* log等级 :　平台报警 */
    MVS_LOG_LV_ERROR,  /* log等级 :　错误 */
    MVS_LOG_LV_WARN ,  /* log等级 :　警告 */
    MVS_LOG_LV_INFO ,  /* log等级 :　流程信息 */
    MVS_LOG_LV_DEBUG,  /* log等级 :　调试 */
}mvs_log_level_e;
/**
 * @brief log信息全局控制接口
 * 
 * @param s32_log_level [in] LOG等级（向上包含）[mvs_log_level_e]
 * @return 操作结果
 * - success : MV_EC_SUCCESS
 */
mv_s32_t mvs_iotc_log_full_ctrl(mv_s32_t s32_log_level);


MVCXX_EXTERN_END

#endif
